@echo off
setlocal enabledelayedexpansion

REM 设置代码页为UTF-8，解决中文显示乱码问题
chcp 65001 >nul
echo 已设置代码页为UTF-8，解决中文显示问题
echo 开始Firmware_Downloader固件下载工具打包过程
echo 时间: %date% %time%
echo.

echo ===== Firmware_Downloader自动打包脚本开始执行 =====
echo.

REM 检查Conda是否已安装
echo 正在检查Conda是否已安装...
where conda >nul 2>&1
if %errorlevel% equ 0 (
    echo [成功] 检测到Conda已安装，将使用Conda环境。
) else (
    echo [错误] 未检测到Conda环境！
    echo 请安装Anaconda或Miniconda后再运行此脚本
    echo 下载地址: https://www.anaconda.com/download/ 或 https://docs.conda.io/en/latest/miniconda.html
    pause
    exit /b 1
)

echo.

REM 检查pyqt5虚拟环境是否存在
echo 检查pyqt5虚拟环境是否存在...
call conda env list | findstr /C:"pyqt5" >nul
if %errorlevel% equ 0 (
    echo pyqt5虚拟环境已存在，将使用该环境...
) else (
    echo pyqt5虚拟环境不存在，正在创建...
    
    echo 正在创建新的Python虚拟环境...
    call conda create -y -n pyqt5 python=3.12
    
    REM 等待一会儿，确保环境创建完成
    timeout /t 2 >nul
    
    echo pyqt5环境创建成功
)

REM 激活pyqt5虚拟环境
echo 激活pyqt5虚拟环境...
call conda activate pyqt5

REM 检查环境是否成功激活
call conda info --envs > conda_info_temp.txt
findstr /C:"*" conda_info_temp.txt | findstr /C:"pyqt5" >nul
if %errorlevel% neq 0 (
    echo [警告] 激活pyqt5虚拟环境可能失败，将使用conda run命令执行后续操作
    set USE_CONDA_RUN=1
) else (
    echo 成功激活pyqt5虚拟环境
    set USE_CONDA_RUN=0
)

if exist conda_info_temp.txt del conda_info_temp.txt

REM 检查并安装必要的依赖项
echo.
echo 正在检查并安装Firmware_Downloader项目必要的依赖项...

REM 根据环境激活状态选择执行方式
if defined USE_CONDA_RUN (
    if %USE_CONDA_RUN% equ 1 (
        echo 使用conda run执行后续命令...
        
        REM 检查PyInstaller
        echo 检查PyInstaller...
        conda run -n pyqt5 python -c "import PyInstaller" >nul 2>&1
        if %errorlevel% neq 0 (
            echo 正在安装PyInstaller...
            conda run -n pyqt5 pip install PyInstaller
        ) else (
            echo PyInstaller已安装，跳过...
        )

        REM 检查PyQt5
        echo 检查PyQt5...
        conda run -n pyqt5 python -c "import PyQt5" >nul 2>&1
        if %errorlevel% neq 0 (
            echo 正在安装PyQt5...
            conda run -n pyqt5 pip install PyQt5==5.15.9
        ) else (
            echo PyQt5已安装，跳过...
        )

        REM 检查pyserial
        echo 检查pyserial...
        conda run -n pyqt5 python -c "import serial" >nul 2>&1
        if %errorlevel% neq 0 (
            echo 正在安装pyserial...
            conda run -n pyqt5 pip install pyserial==3.5
        ) else (
            echo pyserial已安装，跳过...
        )

        REM 检查pymodbus
        echo 检查pymodbus...
        conda run -n pyqt5 python -c "import pymodbus" >nul 2>&1
        if %errorlevel% neq 0 (
            echo 正在安装pymodbus...
            conda run -n pyqt5 pip install pymodbus==3.5.4
        ) else (
            echo pymodbus已安装，跳过...
        )
        
        REM 执行打包操作
        echo.
        echo 正在运行打包脚本...
        
        REM 检查并删除build和dist文件夹
        echo 检查并删除旧的build和dist文件夹...
        if exist build (
            echo 删除build文件夹...
            rmdir /S /Q build
            echo build文件夹已删除
        )

        if exist dist (
            echo 删除dist文件夹...
            rmdir /S /Q dist
            echo dist文件夹已删除
        )

        REM 删除旧的spec文件
        echo 删除旧的spec文件...
        if exist Firmware_Downloader.spec del Firmware_Downloader.spec
        if exist main.spec del main.spec
        echo 旧的spec文件已删除

        REM 检查build.py是否存在
        if exist build.py (
            echo 正在运行Python打包脚本...
            conda run -n pyqt5 python build.py
            if %errorlevel% neq 0 (
                echo [警告] 打包过程中可能出现错误，但将继续执行...
            ) else (
                echo 打包操作完成
            )
        ) else (
            echo [错误] 未找到build.py文件，无法执行打包操作
            pause
            exit /b 1
        )
    ) else (
        REM 使用正常方式执行（环境已成功激活）
        goto :NORMAL_EXECUTION
    )
) else (
    :NORMAL_EXECUTION
    REM 检查PyInstaller
    echo 检查PyInstaller...
    python -c "import PyInstaller" >nul 2>&1
    if %errorlevel% neq 0 (
        echo 正在安装PyInstaller...
        call pip install PyInstaller
    ) else (
        echo PyInstaller已安装，跳过...
    )

    REM 检查PyQt5
    echo 检查PyQt5...
    python -c "import PyQt5" >nul 2>&1
    if %errorlevel% neq 0 (
        echo 正在安装PyQt5...
        call pip install PyQt5==5.15.9
    ) else (
        echo PyQt5已安装，跳过...
    )

    REM 检查pyserial
    echo 检查pyserial...
    python -c "import serial" >nul 2>&1
    if %errorlevel% neq 0 (
        echo 正在安装pyserial...
        call pip install pyserial==3.5
    ) else (
        echo pyserial已安装，跳过...
    )

    REM 检查pymodbus
    echo 检查pymodbus...
    python -c "import pymodbus" >nul 2>&1
    if %errorlevel% neq 0 (
        echo 正在安装pymodbus...
        call pip install pymodbus==3.5.4
    ) else (
        echo pymodbus已安装，跳过...
    )

    REM 执行打包操作
    echo.
    echo 正在运行打包脚本...

    REM 检查并删除build和dist文件夹
    echo 检查并删除旧的build和dist文件夹...
    if exist build (
        echo 删除build文件夹...
        rmdir /S /Q build
        echo build文件夹已删除
    )

    if exist dist (
        echo 删除dist文件夹...
        rmdir /S /Q dist
        echo dist文件夹已删除
    )

    REM 删除旧的spec文件
    echo 删除旧的spec文件...
    if exist Firmware_Downloader.spec del Firmware_Downloader.spec
    if exist main.spec del main.spec
    echo 旧的spec文件已删除

    REM 检查build.py是否存在
    if exist build.py (
        echo 正在运行Python打包脚本...
        python build.py
        if %errorlevel% neq 0 (
            echo [警告] 打包过程中可能出现错误，但将继续执行...
        ) else (
            echo 打包操作完成
        )
    ) else (
        echo [错误] 未找到build.py文件，无法执行打包操作
        pause
        exit /b 1
    )
)

echo.
echo 打包过程完成
echo 时间: %date% %time%

echo 如果打包成功，可执行文件将位于 dist/Firmware_Downloader.exe

echo.
echo 正在创建bin目录并复制文件...

REM 检查打包是否成功
if not exist dist\Firmware_Downloader.exe (
    echo [错误] 打包失败，找不到可执行文件 dist\Firmware_Downloader.exe！
    pause
    exit /b 1
)

REM 创建bin目录
if not exist bin (
    echo 创建bin目录...
    mkdir bin
    echo 已创建bin目录
) else (
    echo bin目录已存在，将强制覆盖文件...
)

REM 复制可执行文件到bin目录
echo 正在复制Firmware_Downloader.exe到bin目录...
copy /Y dist\Firmware_Downloader.exe bin\
if %errorlevel% equ 0 (
    echo ✅ 已成功复制可执行文件到bin目录
) else (
    echo ❌ 复制可执行文件失败
    pause
    exit /b 1
)

REM 复制configs配置文件夹
if exist configs (
    echo 正在复制configs目录...
    xcopy configs bin\configs\ /E /H /C /I /Y
    if %errorlevel% equ 0 (
        echo ✅ 已复制configs目录
    ) else (
        echo ⚠️ 复制configs目录时出现警告
    )
) else (
    echo ℹ️ configs目录不存在，跳过复制
)

REM 复制log目录（如果存在）
if exist log (
    if not exist bin\log mkdir bin\log
    echo ℹ️ 创建了log目录供应用使用
)

REM 创建README文件
echo 正在创建README.txt...
echo Firmware_Downloader 固件下载工具 > bin\README.txt
echo ======================= >> bin\README.txt
echo. >> bin\README.txt
echo 这是一个基于CAN通信的固件下载工具，支持通过CAN通信进行固件更新。 >> bin\README.txt
echo. >> bin\README.txt
echo 使用说明: >> bin\README.txt
echo 1. 直接运行"Firmware_Downloader.exe"启动应用程序 >> bin\README.txt
echo 2. 在连接配置面板中选择正确的COM口和CAN ID >> bin\README.txt
echo 3. 点击"连接"按钮连接到目标设备 >> bin\README.txt
echo 4. 选择固件文件(.s19或.hex格式) >> bin\README.txt
echo 5. 点击"开始下载"进行固件更新 >> bin\README.txt
echo. >> bin\README.txt
echo 支持的固件格式: >> bin\README.txt
echo - Motorola S19格式(.s19) >> bin\README.txt
echo - Intel HEX格式(.hex) >> bin\README.txt
echo. >> bin\README.txt
echo 构建日期: %date% >> bin\README.txt
echo 构建时间: %time% >> bin\README.txt
echo ✅ 已创建README.txt

REM 创建版本信息文件
echo 正在创建version.txt...

REM 初始化默认版本号
set "version=1.0.0"

REM 检查bin/version.txt是否存在
if exist bin\version.txt (
    echo 检测到旧版本文件，正在读取版本号...
    
    REM 从文件中提取版本号
    for /f "tokens=2 delims=: " %%a in ('findstr /C:"版本:" bin\version.txt') do (
        set "old_version=%%a"
        echo 当前版本: !old_version!
    )
    
    REM 解析版本号的各个部分
    for /f "tokens=1,2,3 delims=." %%a in ("!old_version!") do (
        set "major=%%a"
        set "minor=%%b"
        set "patch=%%c"
    )
    
    REM 增加补丁版本号
    set /a "new_patch=!patch!+1"
    
    REM 构建新版本号
    set "version=!major!.!minor!.!new_patch!"
    
    echo 版本号已更新: !old_version! -^> !version!
) else (
    echo 未找到旧版本文件，使用默认版本号 !version!
)

REM 写入新版本文件
echo 版本: !version! > bin\version.txt
echo 构建日期: %date% >> bin\version.txt
echo 构建时间: %time% >> bin\version.txt
echo 项目: OpenBLT固件下载工具 >> bin\version.txt
echo ✅ 已创建version.txt，版本号: !version!

echo.
echo 🧹 正在清理构建文件...

REM 删除build和dist文件夹
if exist build (
    echo 删除build文件夹...
    rmdir /S /Q build
    echo ✅ build文件夹已删除
)

if exist dist (
    echo 删除dist文件夹...
    rmdir /S /Q dist
    echo ✅ dist文件夹已删除
)

REM 删除spec文件
if exist Firmware_Downloader.spec (
    del Firmware_Downloader.spec
    echo ✅ 已删除spec文件
)

echo.
echo 🎉 打包完成！所有文件已成功复制到bin目录！
echo.
echo 📂 bin目录内容:
dir bin\ /B
echo.
echo 🚀 您可以直接运行 bin\Firmware_Downloader.exe 来启动固件下载工具
echo 💡 该工具支持通过XCP over CAN协议进行固件下载
echo.

echo ===== OpenBLT自动打包脚本执行完成 =====

pause
